package controller

import (
	"errors"
	"web-app/dao/mysql"
	"web-app/logic"
	"web-app/models"

	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator"
	"go.uber.org/zap"
)

// SignUpHandler 注册用户接口
// @Summary 注册用户接口
// @Description 注册用户接口
// @Tags 用户相关接口
// @Accept application/json
// @Produce application/json
// @Param object query models.ParamSignUP false "查询参数"
// @Success 200 {object} ResponseData
// @Router /signup [post]
func SignUpHandler(c *gin.Context) {
	//获取参数和参数校验
	var p models.ParamSignUP
	if err := c.ShouldBindJSON(&p); err != nil {
		zap.L().Error("SignUp with invalid param", zap.Error(err))
		//判断err是不是validator.ValidationErrors类型
		errs, ok := err.(validator.ValidationErrors)
		if !ok {
			ResponseError(c, CodeInvalidParam)
			return
		}
		ResponseErrorWithMsg(c, CodeInvalidPassword, removeTopStruct(errs.Translate(trans)))
		return
	}

	//业务处理
	if err := logic.SignUp(&p); err != nil {
		zap.L().Error("logic.SignUp failed", zap.Error(err))
		if errors.Is(err, mysql.ErrorUserExist) {
			ResponseError(c, CodeUserExist)
		} else {
			ResponseError(c, CodeServerBusy)
		}
		return
	}
	//返回相应
	ResponseSuccess(c, nil)
}

func LoginHandler(c *gin.Context) {
	//获取请求参数和参数校验

	p := new(models.ParamLogin)
	if err := c.ShouldBindJSON(p); err != nil {
		zap.L().Error("Login with invalid param", zap.Error(err))
		//判断err是不是validator.ValidationErrors类型
		errs, ok := err.(validator.ValidationErrors)
		if !ok {
			ResponseError(c, CodeInvalidParam)
			return
		}
		ResponseErrorWithMsg(c, CodeInvalidParam, removeTopStruct(errs.Translate(trans)))
		return
	}

	//业务处理
	token, err := logic.Login(p)
	if err != nil {
		zap.L().Error("logic.Login failed", zap.Error(err))
		if errors.Is(err, mysql.ErrorUserNotExist) {
			ResponseError(c, CodeUserNotExist)
		}
		if errors.Is(err, mysql.ErrorInvalidPassword) {
			ResponseError(c, CodeInvalidPassword)
		}
		return
	}

	//返回相应
	ResponseSuccess(c, token)
}
